//import 包名.类名
import javax.imageio.ImageIO;
//JAVA中进行读写图片的
import javax.swing.*;
//swing是java设计图形画界面(GUI)的工具包
import java.awt.*;
//是用来处理图形最基本的方式
/*
图形界面组件：如：窗口、按钮、菜单等
容器 ：是GUI元素的容器，实现组件管理、布局管理
布局管理器：用来安排图形界面组件的位置
Graphics：在组件上进行图形绘制所使用的图形环境的父类
事件处理对象：用来处理图形界面组件所触发的事件
 */
import java.awt.event.KeyListener;
//接口 监听键盘案件
//事件
import java.awt.image.BufferedImage;
/*
是一个带缓冲区图像类
主要作用是将一幅图片加载到内存中（BufferedImage生成的图片在内存里有一个图像缓冲区
利用这个缓冲区我们可以很方便地操作这个图片）
 */
import java.io.File;
//是文件和目录路径名的抽象表示 寻找路径
import java.io.IOException;
//java的输入输出异常包
import java.util.Scanner;
import java.awt.event.KeyEvent;
//当按下、释放或键入某个键时，组件对象（如文本字段）将生成此低级别事件。
//传送给KeyListener
import java.lang.Math;
//导入Random
public class GamePanel extends JLayeredPane implements KeyListener {
    //extends 继承...类 可以使用父类的方法
    //interface 接口
    //KeyListener 需要重写他的的三个方法
    /*JPanel 面板组件 可以在窗口上设置按钮，图片，文字等等。但是设置位置时，不精确，因为JPanel
    具有居中的特性
    JLayeredPane 作用差不多,但他有个特点，允许覆盖
    */
    //static 静态方法
    //静态方法不依赖于任何对象就可以直接访问
    static int[] arrx= {20,220,420,620,820,1020};
    static  int x = arrx[(int)(Math.random()*6)];
    //随机生成逃的x的坐标
    static int[] arry= {0,200,400,600};
    static  int y = arry[(int)(Math.random()*4)];
    //随机生成逃的y的坐标
    static int[] arrx2= {20,220,420,620,820,1020};
    static int x2 = arrx2[(int)(Math.random()*6)];
    //随机生成追的x的坐标
    static int[] arry2= {0,200,400,600};
    static int y2 = arry2[(int)(Math.random()*4)];
    //随机生成追的y的坐标
    int count;
    //计数
    int count2;
    //计陷阱次数
    static int[] arrybe= {1,2,3,4,5};
    static int be = arrybe[(int)(Math.random()*5)];
    //随机生成人物第一步
    static int[] arryguai= {1,2,3,4,5};
    static int guai = arryguai[(int)(Math.random()*5)];
    int Snare_x=0;
    int Snare_y=0;
    //随机生成陷阱第一步

    String be1;
    String guaii;
    BufferedImage background1,person1,guai1;
    //定义图片的名称
    String  background;
    public GamePanel(){

        String path1 = "D:\\IDEA\\untitled\\game\\src\\image\\1.png";
        String path2 = "D:\\IDEA\\untitled\\game\\src\\image\\2.jpg";
        String path3 = "D:\\IDEA\\untitled\\game\\src\\image\\3.jpg";
        String path4 = "D:\\IDEA\\untitled\\game\\src\\image\\4.jpg";
        String path5 = "D:\\IDEA\\untitled\\game\\src\\image\\5.jpg";
        String path6 = "D:\\IDEA\\untitled\\game\\src\\image\\6.jpg";
        String path7 = "D:\\IDEA\\untitled\\game\\src\\image\\7.jpg";
        String path8 = "D:\\IDEA\\untitled\\game\\src\\image\\last.gif";
        //背景路径



        //。。。
//        switch (be){
//            case 1:
//                be1="D:\\IDEA\\untitled\\game\\src\\image\\run1.png";
//                break;
//            case 2:
//                be1="D:\\IDEA\\untitled\\game\\src\\image\\run2.png";
//                break;
//        }

        if(be==1){
            be1="D:\\IDEA\\untitled\\game\\src\\image\\run1.png";
        }
        else if(be==2){
            be1="D:\\IDEA\\untitled\\game\\src\\image\\run2.png";
        }
        else if(be==3){
            be1="D:\\IDEA\\untitled\\game\\src\\image\\run3.png";
        }
        else if(be==4){
            be1="D:\\IDEA\\untitled\\game\\src\\image\\run4.png";
        }
        else if(be==5){
            be1="D:\\IDEA\\untitled\\game\\src\\image\\run5.png";
        }
        //人物随机生成完成
        if(guai==1){
            guaii="D:\\IDEA\\untitled\\game\\src\\image\\guai1.png";
        }
        else if(guai==2){
            guaii="D:\\IDEA\\untitled\\game\\src\\image\\guai2.png";
        }
        else if(guai==3){
            guaii="D:\\IDEA\\untitled\\game\\src\\image\\guai3.png";
        }
        else if(guai==4){
            guaii="D:\\IDEA\\untitled\\game\\src\\image\\guai4.png";
        }
        else if(guai==5){
            guaii="D:\\IDEA\\untitled\\game\\src\\image\\guai5.png";
        }
        //生成怪物结束

        background=path5;
        //设置背景图

        //把可能引发异常的语句封装在 try 语句块中，用以捕获可能发生的异常。
        //如果 try 语句块中发生异常，那么一个相应的异常对象就会被拋出，
        // 然后 catch 语句就会依据所拋出异常对象的类型进行捕获，并处理。
        // 处理之后，程序会跳过 try 语句块中剩余的语句，转到 catch 语句块后面的第一条语句开始执行。
            try {
                background1 =ImageIO.read(new File(background));
                //ImageIO 读取和写入图像
                //使用read会抛出异常，需要用try和catch捕获
                //read 读取文件
                //file 通过将给定的路径名 字符串转换为抽象类路径 来创建新的实例
            } catch (IOException e) {
                e.printStackTrace();
            }
            //read抛出IOException异常
            //IOException: 写读异常
            //e.printStackTrace 将错误信息全部打印至控制台上展示

        try {
            person1 =ImageIO.read(new File(be1));
        } catch (IOException e) {
            e.printStackTrace();
        }

        try {
            guai1 =ImageIO.read(new File(guaii));

        } catch (IOException e) {
            e.printStackTrace();
        }
//
//        int x11=GamePanel.x-GamePanel.x2;
//        int y11=GamePanel.y-GamePanel.y2;
//        if(Math.abs(x11)<=60&Math.abs(y11)<=60){
//            System.out.println("被抓到了，要被吃了┭┮﹏┭┮");
//        }
//        if(x==x2&y==y2){
//            System.out.println("你输了");
//        }
    }
    public  void paint(Graphics g)  {
        //重写了JLayeredPane中的paint方法
        //paint(Graphics g) 获取画笔
        //绘制图像,第一参数照片,二、三位置,四、五是大小，六是绘制指定图像中已缩放到适合指定矩形内部的图像
        g.drawImage(background1,0,0,1200,800,null);
        //定义背景大小跟窗口大小一样
        //画出背景图  设置参数
//        g.drawImage(person,100,100,200,200,null);
        g.drawImage(person1,GamePanel.x,GamePanel.y,175,150,null);
        //绘制逃的人物  设置参数
        g.drawImage(guai1,x2,y2,170,140,null);
        //绘制抓的人物 设置参数
        //字体样式  字体加粗之类的  字体大小
        Font f1 = new Font("华文新魏",Font.PLAIN,50);
        //设置字体样式
        g.setColor(Color.red);g.setFont(f1);g.drawString("你追我逃",500,100);
        g.setColor(Color.orange);g.drawLine(1200,200,0,200);
        g.setColor(Color.orange);g.drawLine(1200,400,0,400);
        g.setColor(Color.orange);g.drawLine(1200,600,0,600);
        g.setColor(Color.orange);g.drawLine(200,0,200,800);
        g.setColor(Color.orange);g.drawLine(400,0,400,800);
        g.setColor(Color.orange);g.drawLine(600,0,600,800);
        g.setColor(Color.orange);g.drawLine(800,0,800,800);
        g.setColor(Color.orange);g.drawLine(1000,0,1000,800);
        //绘制字  设置参数
        //字体颜色
//        if(x==x2|y==y2){
//            g.setColor(Color.red);g.setFont(f1);g.drawString("游戏结束",500,100);
//        }
//        else {
//
//        }
        if(x==x2&&y==y2){
            Font f2 = new Font("华文琥珀",Font.PLAIN,80);
            g.setColor(new Color(220,20,60));g.setFont(f2);g.drawString("被吃掉了,追捕者胜利",240,350);
            g.setColor(new Color(220,20,60));g.setFont(f2);g.drawString("按P重新开始游戏",320,430);
            Snare_x=0;
            Snare_y=0;
        }
        if(Snare_x==x2&&Snare_y==y2){
            Font f2 = new Font("华文琥珀",Font.PLAIN,80);
            g.setColor(new Color(220,20,60));g.setFont(f2);g.drawString("踩到陷阱了,逃亡者胜利",240,350);
            g.setColor(new Color(220,20,60));g.setFont(f2);g.drawString("按P重新开始游戏",320,430);
            Snare_x=0;
            Snare_y=0;
        }
        if(count2==3){
            Font f3 = new Font("华文琥珀",Font.PLAIN,30);
            g.setColor(Color.black);g.setFont(f3);g.drawString("陷阱已经没有了",20,700);
        }
        else if(count2>3){
            Font f2 = new Font("华文琥珀",Font.PLAIN,80);
            g.setColor(new Color(220,20,60));g.setFont(f2);g.drawString("逃亡者作弊了,追捕者胜利",150,350);
            g.setColor(new Color(220,20,60));g.setFont(f2);g.drawString("按P重新开始游戏",320,430);
            count2=0;

        }
        //生成游戏结束的字
    }
    public void keyTyped(KeyEvent e) {
        //按下一个键，在按另一个键调用这个方法
        // alt+F4
    }
    public void keyPressed(KeyEvent e){
        //keyPressed  按下某个键时调用此方法。
        char charA=e.getKeyChar();
        //getKeyChar 返回的是每欠敲击键盘后得到的字符
        System.out.println("你按了《"+charA+"》键");
        int code = e.getKeyCode();
        //当按下键盘的指定键时，运行内容
        switch (code) {
            case KeyEvent.VK_A: //向左
                GamePanel.x -=200;
                System.out.println("逃的x,y轴:"+x+","+y);
                break;
            case KeyEvent.VK_D : //向右
                GamePanel.x +=200;
                System.out.println("逃的x,y轴:"+x+","+y);
                break;
            case KeyEvent.VK_W : //向上
                GamePanel.y -=200;
                System.out.println("逃的x,y轴:"+x+","+y);
                break;
            case  KeyEvent.VK_S : //向下
                GamePanel.y +=200;
                System.out.println("逃的x,y轴:"+x+","+y);
                break;
            case KeyEvent.VK_Q:
                Snare_x=x;
                Snare_y=y;
                //陷阱坐标
                count2++;
                break;
            case KeyEvent.VK_LEFT: //向左
                GamePanel.x2 -=200;
                System.out.println("追的x,y轴:"+x2+","+y2);
                count++;
                System.out.println("次数为:"+count);
                break;
            case KeyEvent.VK_RIGHT:  //向右
                GamePanel.x2 +=200;
                System.out.println("追的x,y轴:"+x2+","+y2);
                count++;
                System.out.println("次数为:"+count);
                break;
            case KeyEvent.VK_UP:  //向上
                GamePanel.y2 -=200;
                System.out.println("追的x,y轴:"+x2+","+y2);
                count++;
                System.out.println("次数为:"+count);
                break;
            case  KeyEvent.VK_DOWN:  //向下
                GamePanel.y2 +=200;
                System.out.println("追的x,y轴:"+x2+","+y2);
                count++;
                System.out.println("次数为:"+count);
                break;
            case KeyEvent.VK_ENTER:
                x = arrx[(int)(Math.random()*6)];
                y = arry[(int)(Math.random()*4)];
                break;
            case KeyEvent.VK_SPACE:
                x2 = arrx2[(int)(Math.random()*6)];
                y2 = arry2[(int)(Math.random()*4)];
                break;
            case KeyEvent.VK_P:
                x = arrx[(int)(Math.random()*6)];
                y = arry[(int)(Math.random()*4)];
                x2 = arrx2[(int)(Math.random()*6)];
                y2 = arry2[(int)(Math.random()*4)];
                count=0;
                count2=0;
                break;
            default:
                System.out.println("按错键了");
                break;

        }
        if(x==x2&&y==y2){
            System.out.println("游戏结束");
        }
        if(x>1200|x<0){
            x = arrx[(int)(Math.random()*6)];
            System.out.println("出界了");
        }
        else if (x2>1200|x2<0){
            x2 = arrx2[(int)(Math.random()*6)];
            System.out.println("出界了");
        }
        else if(y>600|y<0){
            y = arry[(int)(Math.random()*4)];
        }
        else if(y2>600|y2<0){
            y2 = arry2[(int)(Math.random()*4)];
        }

        repaint();
    }
    public void keyReleased(KeyEvent e) {
        //按下键后弹起发生了什么
        //按下w没事发生，松开x+10之类的
    }
}
